import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris

# 加载数据集
data = load_iris()
X = data.data
y = data.target

# 创建PCA对象，并指定要保留的主成分数
pca = PCA(n_components=2)

# 对数据进行PCA变换
X_pca = pca.fit_transform(X)

# 打印解释的总方差比
print(f"解释的总方差比: {sum(pca.explained_variance_ratio_)}")

# 可视化降维后的数据
plt.figure(figsize=(8, 6))  # 创建一个新的图形，设置图形的大小为8x6英寸
for target in np.unique(y):  # 遍历目标变量y中的唯一值
    plt.scatter(  # 绘制散点图
        X_pca[y == target, 0],  # 选择降维后数据中对应当前目标类别的第一个主成分
        X_pca[y == target, 1],  # 选择降维后数据中对应当前目标类别的第二个主成分
        label=data.target_names[target]  # 设置图例标签为当前目标类别的名称
    )
plt.xlabel('Principal Component 1')  # 设置x轴标签为'主成分1'
plt.ylabel('Principal Component 2')  # 设置y轴标签为'主成分2'
plt.title('PCA of Iris Dataset')  # 设置图形标题为'鸢尾花数据集的PCA'
plt.legend()  # 显示图例
plt.show()  # 显示图形->图示说明：主成分1和主成分2，可以很好的把目标分成3类


# 打印特征值和特征向量
eigenvalues = pca.explained_variance_
eigenvectors = pca.components_

print(f"特征值: {eigenvalues}")
print(f"特征向量:\n{eigenvectors}")